#include <stdio.h>
#include "thirdparty/log.h"
#include <stdlib.h>
#include <app/app_mqtt.h>
#include "app/app_message.h"
#include <string.h>
#include "app/app_router.h"

//最大连接少个下游 通讯的设备
#define MAX_DEVICE_CONT 10
//存放下游设备的指针的一个数组
static Device **devices = NULL;
//这里显示了下游设备的数量
static int device_cont = 0;


/// @brief 给mqtt提供的回调函数  当他接受到数据  调用这个函数
/// @param payload 
/// @param payload_len 
/// @return 
int mqtt_reve_callbake(char *payload, int payload_len)
{
    Message message;  
    Device *device = NULL;
    char buf[1024] ={0};
    log_trace("payload = %s",payload);
    //把数据转化成 massge格式
    if(app_message_JosnTrunMessage(&message,payload,payload_len) < 0)
    {
        log_warn("app+_router osnTrunMessage fail");
    }
    log_trace("\nmessage = %s",message.ptr);
    //看数据是发送给你个设备的
    for(int i = 0 ; i < device_cont;i++)
    {
        if(message.connect_type == devices[i]->connect_type)
        {
             device = devices[i];
            break;
        }
    }
    //判断是我们需要的类型马
    if(device == NULL)
    {
        //不是
        log_warn("app+_router connectTpye fail");
        return -1;
    }
    //把数据转成2进制
    int result = 0;
    result = app_message_MessageTrunByte(&message,buf,1024);
    if(result == 0)
    {
        log_warn("app_router MessageTrunByte fail");
        return -1;
    }
    log_trace("\nbin = %s",buf);
    //释放massage内存
    app_message_free(&message);
    //把数据发送给下游通讯设备
    app_device_write(device,buf,result);
    return 0;
}


/// @brief 给下游通讯设备  device 提供的回调函数 当他加接受到数据 调用这个 函数把数据给我们
/// @param device 
/// @param buf 
/// @param len 
/// @return 
int device_recv_callback(Device *device,void *buf,int len)
{
    Message message;
    char json_buf[1024] = {0};
    //把数据转成message
    if(app_message_ByteTrunMessage(&message,buf,len) < 0)
    {
        log_warn("app_router ByteTrunMessage fail");
        return -1;
    }
    //把数据转成json
   if( app_message_MessageTrunJosn(&message,json_buf,1024) < 0)
   {
        log_warn("app_router MessageTrunJosn fail");
        return -1;
   }

   //关闭message
   app_message_free(&message);
    //把数据发送到mqtt客户端  strlen不会计算\0  所以加1
    app_mqtt_send(json_buf,strlen(json_buf) + 1);
    return 0;
}





/// @brief 初始化一个路由器
/// @param  
/// @return 
int app_touter_init(void)
{
    //给存放下游设备指针的是数组开辟空间
    devices = malloc(sizeof(Device *) * MAX_DEVICE_CONT);
    //判断分配成功没有
    if(devices == NULL)
    {
        //失败
        log_error("app_router mem mallco  fail");
        return -1;
    }
    //把 上游的 mqtt服务器启动
    if(app_mqtt_init() < 0)
    {
        //失败
        log_warn("app_router mqtt init fail");
        return -1;
    }
    //注册一个回调函数到 mqtt服务器  他接受到数据调用
    app_mqtt_registerReceive(mqtt_reve_callbake);
    log_trace("app_touter_init seccuud");
    return 0;
}

/// @brief 注册一个下游的通讯设备
/// @param device 
/// @return 
int app_touter_registerDevice(Device *device)
{
    //判断当前设备时候是否注册满了
    if(device_cont >= MAX_DEVICE_CONT)
    {
        //注册满了
        log_warn("app_router register fun fail");
        return -1;
    }
    //注册
    devices[device_cont++] = device;
    //在下游 通讯设备 注册一个回调函数  当他接受到数据调用这个函数 把数据给我
    device->vptr->recv_callback = device_recv_callback;
    //是启动下游的通讯设备
    app_device_start(device);
    log_trace("app_touter_registerDevice devicevr register succeed");
    return 0;
}

/// @brief 关闭路由器
/// @param  
void app_touter_close(void)
{
    //关闭客户端
    app_mqtt_close();
    //把连接的所以下游通信设备关调
    for(int i = 0; i < device_cont;i++)
    {
        app_device_stop(devices[i]);
        app_device_close(devices[i]);
    }
    //释放 devices内存
    free(devices);
    device_cont = 0;
    devices = NULL;
}